const express = require('express');
const OSS = require('ali-oss');
const path = require('path');
const rateLimit = require('express-rate-limit');
const cors = require('cors');
require('dotenv').config();

const app = express();
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));

// 配置 CORS - 使用白名单而非通配符
const allowedOrigins = process.env.CORS_ORIGINS 
  ? process.env.CORS_ORIGINS.split(',') 
  : ['http://localhost:3000', 'http://localhost:5173']; // 开发环境默认值

  app.use(cors({
    origin: '*',
    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
    credentials: true
  }));

// 配置速率限制
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 100, // 限制每个IP在15分钟内最多100次请求
  message: '请求频率过高，请稍后再试'
});
app.use('/api/upload-url', limiter);

// OSS客户端配置
const client = new OSS({
  region: process.env.OSS_REGION,
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  bucket: process.env.OSS_BUCKET,
});

// 修正的允许文件类型列表
const ALLOWED_MIME_TYPES = [
  'image/jpeg',
  'image/png',
  'image/gif',
  'application/pdf',
  'application/vnd.openxmlformats-officedocument.wordprocessingml.document' // 正确的DOCX类型
];

// 验证文件类型
function isValidFileType(contentType) {
  return ALLOWED_MIME_TYPES.includes(contentType);
}

// 生成上传用的预签名URL
app.get('/api/upload-url', async (req, res, next) => {
  try {
    const { filename, contentType } = req.query;
    
    // 验证请求参数
    if (!filename || !contentType) {
      return res.status(400).json({ error: '文件名和内容类型是必需的' });
    }
    
    // 验证文件类型
    if (!isValidFileType(contentType)) {
      console.log('不支持的文件类型:', contentType);
      return res.status(400).json({ 
        error: '不支持的文件类型',
        supportedTypes: ALLOWED_MIME_TYPES
      });
    }

    // 生成唯一文件名
    const key = `uploads/${Date.now()}-${filename}`;
    
    // 生成预签名URL，有效期1小时
    const url = client.signatureUrl(key, {
      method: 'PUT',
      expires: 3600,
      'Content-Type': contentType
    });

    console.log('生成的预签名URL:', url); // 调试用

    res.json({ 
      uploadUrl: url,
      fileKey: key,
      expiresIn: 3600
    });
  } catch (error) {
    console.error('生成预签名URL失败:', error);
    next(error); // 将错误传递给全局错误处理中间件
  }
});

// 新增：处理评价提交的API
app.post('/api/reviews', async (req, res, next) => {
  try {
    // 获取请求数据
    const { 
      userId, 
      userName, 
      restaurantName, 
      restaurantLocation, 
      dishName, 
      rating, 
      reviewText, 
      imageKeys 
    } = req.body;

    // 简单验证（实际应用中可能需要更全面的验证）
    if (!userId || !restaurantName || !restaurantLocation || !rating || !reviewText) {
      return res.status(400).json({ error: '缺少必要的评价信息' });
    }

    // 这里可以添加保存评价数据到数据库的逻辑
    // 为简化示例，我们假设数据已成功保存，并生成一个评价ID
    const reviewId = Date.now().toString(); // 实际应用中应该使用数据库生成的ID

    // 返回成功响应
    res.status(201).json({
      id: reviewId,
      message: '评价提交成功',
      timestamp: new Date().toISOString()
    });

  } catch (error) {
    console.error('提交评价失败:', error);
    next(error);
  }
});

// 全局错误处理中间件
app.use((err, req, res, next) => {
  const statusCode = err.statusCode || 500;
  
  // 更详细的错误日志
  console.error(`错误处理 - 状态码: ${statusCode}, 错误:`, err);
  
  res.status(statusCode).json({
    error: {
      message: err.message || '服务器内部错误',
      code: err.code || 'INTERNAL_SERVER_ERROR'
    }
  });
});

// 404处理
app.use((req, res, next) => {
  res.status(404).json({ error: '未找到该资源' });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
});